<?php

function ndocsclass($matriz, $grupos, $i, $j)
{
	$ndocclass=0;
			
	for($k=0;$k<count($matriz);$k++)
	{
		//aqui tengo que validar lo del doc por cluster
		if(($matriz[$k][$i]>0.76123599479678)&&(in_array($matriz[$k], $grupos[$j])))
			$ndocclass++;
			
	}
	
	return $ndocclass;
}

function ni($matriz, $i)
{
	$ni=0;
			
	for($k=0;$k<count($matriz);$k++)
	{
		if($matriz[$k][$i]>0.76123599479678)
			$ni++;
	}
	return $ni;
}

function entropia($matriz, $grupos) 
{    
	$n=count($matriz);//numero de documentos
	$m=count($grupos);//numero de grupos/clusteres
	$numterms=count($matriz[0]);//numero de terminos
	
	for($j=0;$j<$m;$j++)
	{
		$tamclus=count($grupos[$j]); //tamaño de cluster j
		$E[$j]=0; //Inicialización
		
		for($i=0;$i<$numterms;$i++)
		{
			//numero de documentos de clase i en el cluster j
			$ndocclass=ndocsclass($matriz, $grupos, $i, $j);
			
			//Probabilidad que un documento miembro del cluster j pertenezca a la clase i
			if(($ndocclass==0)||($tamclus==0))
			{
				$p[$j]=0;
				$cuenta=0;
			}
			else
			{
				$p[$j]=($ndocclass/$tamclus);
				$cuenta=$p[$j]*log($p[$j]);
			}
			
			$E[$j]=$cuenta+$E[$j]; //Entropia por cada cluster
		}
		if($E[$j]!=0)
			$E[$j]=(-1)*$E[$j];
		//$Ecs+=(($tamclus[$j]*$E[$j])/$n);//Entropia total del conjunto de clusters
	}
	//var_dump($E);
    return $E;
}

function entropia_total($E, $matriz, $groups)
{
	$Et=0;
	for($i=0;$i<count($E);$i++)
	{
		$Et=($E[$i]*(count($groups[$i])/count($matriz[0])))+$Et;
	}
	return $Et;
}

function pureza($matriz, $grupos)
{
	$pij=invertir(precision($matriz, $grupos));
	for($i=0;$i<count($grupos);$i++)
	{
		$p[$i]=max($pij[$i]);//maxima entropia del cluster
	}
	return $p;
}

function pureza_total($p, $matriz, $grupos)
{
	$Pt=0;
	for($i=0;$i<count($p);$i++)
	{
		$Pt=($p[$i]*(count($grupos[$i])/count($matriz[0])))+$Pt;
	}
	return $Pt;
}

function invertir($matriz)
{
	for($i=0; $i<count($matriz[0]); $i++)
    {
            for($j=0; $j<count($matriz); $j++)
            {
                if($matriz[$j][$i]!=NULL){
                 $inv[$i][$j] = $matriz[$j][$i];   
                }
            }
    }
    return $inv;
}

function precision($matriz, $grupos)
{
	$n=count($matriz);//numero de documentos
	$m=count($grupos);//numero de grupos/clusteres
	$numterms=count($matriz[0]);//numero de terminos
	
	for($j=0;$j<$m;$j++)
	{
		$nj=count($grupos[$j]); //tamaño de cluster j
		
		for($i=0;$i<$numterms;$i++)
		{
			//numero de documentos de clase i en el cluster j
			$ndocclass=ndocsclass($matriz, $grupos, $i, $j);
			if($nj>0){
                            $prec[$i][$j]=($ndocclass/$nj);//precision
                        }
		}
	}
	return $prec;//la matriz esta traspuesta(pasa igual con recall, fmeasure y entropia)
}

function recall($matriz, $grupos)
{
	$n=count($matriz);//numero de documentos
	$m=count($grupos);//numero de grupos/clusteres
	$numterms=count($matriz[0]);//numero de terminos
	
	for($j=0;$j<$m;$j++)
	{
		for($i=0;$i<$numterms;$i++)
		{
			//numero de documentos de clase i en el cluster j
			$ndocclass=ndocsclass($matriz, $grupos, $i, $j);
			$ni=ni($matriz, $i);//numero de documentos de la clase i    
                        if($ni>0){
                            $recc[$i][$j]=($ndocclass/$ni);//recall
                        }
		}
	}
	return $recc;
}

function fmeasure($matriz, $grupos) 
{   
	$n=count($matriz);//numero de documentos
	$m=count($grupos);//numero de grupos/clusteres
	$numterms=count($matriz[0]);//numero de terminos
	
	for($j=0;$j<$m;$j++)
	{
		for($i=0;$i<$numterms;$i++)
		{
			$prec=precision($matriz, $grupos);//precision
			$recc=recall($matriz, $grupos);//recall
			//$Fm[$i][$j]=1/(($alpha*(1/$prec[$i][$j]))+((1-$alpha)*(1/$recc[$i][$j])));//F-measure	
			if(count($recc)>0 && count($prec)>0 && ($prec[$i][$j]==0)&&($recc[$i][$j]==0))
			{
				$Fm[$i][$j]=0;
			}
			else
			{
				$Fm[$i][$j]=(2*$prec[$i][$j]*$recc[$i][$j])/($prec[$i][$j]+$recc[$i][$j]);
			}
		}
	}     
    return $Fm;
}

function similitud($matriz, $grupos, $centros)
{
	for($g=0;$g<count($grupos);$g++)
	{
		$sim[$g]=0;
		$lim=count($grupos[$g]);
		for($i=0;$i<$lim;$i++)
		{
			for($j=0;$j<$lim;$j++)
			{				
				if($i!=$j)
				{
					//echo "<br>centro<br>";
					//var_dump($centros[$g]);
					//echo "<br>A<br>";
					//var_dump($grupos[$g][$i]);
					//echo "<br>B<br>";
					//var_dump($grupos[$g][$j]);
					
					$a=distance($grupos[$g][$i], $centros[$g]);
					$b=distance($grupos[$g][$j], $centros[$g]);					
					if($a*$b!=0){$simclus[$i][$j]=($a*$b)/(sqrt($a*$a)*sqrt($b*$b));}
					else{$simclus[$i][$j]=0;}
					

					$sim[$g]+=$simclus[$i][$j];//sumatoria de las similitudes entre los docs
				}
			}
		}
		if(count($grupos[$g])!=0){$sim[$g]=$sim[$g]/((count($grupos[$g]))*(count($grupos[$g])));}//promedio de similitudes por cluster	
		else{$sim[$g]=0;}	
	}
	return $sim;
}

function metricas($matriz, $grupos, $centros)
{
	//llamo todas las metricas de una pa imprimirlas
	$E=entropia($matriz,$grupos);//vector
	$Et=entropia_total($E,$matriz,$grupos);//valor
	$Pur=pureza($matriz,$grupos);//vector
	$PurT=pureza_total($Pur,$matriz,$grupos);//valor
	$Prec=precision($matriz,$grupos);//matriz
	$Fmeas=fmeasure($matriz,$grupos);//matriz
	$Sim=similitud($matriz, $grupos,$centros);//vector
	
	echo "<br><br>";
	
	?>
	</table>
	<h3>Tabla de Entropias y Similitudes</h3>
	<table id="resultadostfidf">
		<?php
		
		echo "<tr>";
		//echo "<td></td>";
		echo "<th>Cluster</th><th>Entropia</th><th>Similitud</th>";
		echo "</tr>";
		
		for($i=0;$i<count($grupos);$i++)
		{
			echo "<tr>";
			echo "<th>".$i."</th>";
			echo "<td>".$E[$i]."</td><td>".$Sim[$i]."</td>";
			echo "</tr>";                                    
		}
		
		?>
	</table>						
	
	<h3>Pureza Total de la tecnica de agrupamiento</h3>
	<?php
		echo $PurT."<br><br>";
	?>
	
	<h3>Tabla de Precision</h3>
	<table id="resultadostfidf">
		<?php
			echo "<tr>";
			echo "<td></td>";
			for($i=0;$i<count($matriz[0]);$i++)
			{
				echo "<th>Clase ".$i."</th>";
			}
			echo "</tr>";
			
			for($i=0;$i<count($grupos);$i++)
			{
				echo "<tr>";
				echo "<th>".$i."</th>";
				for($j=0;$j<count($matriz[0]);$j++)
				{
					echo "<td>".$Prec[$j][$i]."</td>";
				}
				echo "</tr>";                                    
			}
		?>
	</table>
	
	<h3>Tabla de F-measure</h3>
	<table id="resultadostfidf">
		<?php
			echo "<tr>";
			echo "<td></td>";
			for($i=0;$i<count($matriz[0]);$i++)
			{
				echo "<th>Clase ".$i."</th>";
			}
			echo "</tr>";
			
			for($i=0;$i<count($grupos);$i++)
			{
				echo "<tr>";
				echo "<th>".$i."</th>";
				for($j=0;$j<count($matriz[0]);$j++)
				{
					echo "<td>".$Fmeas[$j][$i]."</td>";
				}
				echo "</tr>";                                    
			}
		?>
	</table>
	
	<?php
}
?>
